package gotemplate

import (
	"fmt"
	"os"
	"text/template"
)

type Person struct {
	Name                string
	nonExportedAgeField string
}

/* 模板替换示例，field必须是可访问得 */
func ShowTemplateExample() {
	t := template.New("hello")
	// t, _ = t.Parse("hello {{.Name}} {{.nonExportedAgeField}}!")
	t, _ = t.Parse("hello {{.Name}}!\n")
	p := Person{"Mary", "31"}
	if err := t.Execute(os.Stdout, p); err != nil {
		fmt.Println("There was an error:", err.Error())
	}
	// 如果直接是用Execute第二个参数进行替换，就可以省略FieldName 名字，直接使用 {{.}}
	t, _ = t.Parse("welcome {{.}}!\n")
	if err := t.Execute(os.Stdout, "Luke"); err != nil {
		fmt.Println("There was an error:", err.Error())
	}
	// 当在浏览器环境中进行这些步骤，应首先使用 html 过滤器来过滤内容，例如 {{html .}}， 或者对 FieldName 过滤：{{ .FieldName |html }}。
	// |html 这部分代码，是请求模板引擎在输出 FieldName 的结果前把值传递给 html 格式化器，它会执行 HTML 字符转义（例如把 > 替换为 &gt;）。这可以避免用户输入数据破坏 HTML 文档结构。
	p = Person{">this is test", "21"}
	t, _ = t.Parse("<p>welcome </p>{{.Name | html}}\n")
	if err := t.Execute(os.Stdout, p); err != nil {
		fmt.Println("There was an error:", err.Error())
	}

	template_MustCase()
	template_ifelse()
	template_with_end()
}

/* template.Must 模板验证 */
func template_MustCase() {
	tOk := template.New("ok")
	tErr := template.New("error_template")
	defer func() {
		if err := recover(); err != nil {
			// log.Printf("run time panic: %v", err)
			fmt.Printf("there was some panic: %v\n", err)
		}
	}()

	template.Must(tOk.Parse("/*and a comment*/ some static test: {{.Name}}"))
	fmt.Println("The first one parsed OK.")
	fmt.Println("The next one ought to fail.")
	// 这里会产生panic 运行时可以注释掉
	template.Must(tErr.Parse(" some static text {{.Name}"))
}

/* if-else 模板示例 */
func template_ifelse() {
	fmt.Println("template_ifelse case===============")
	tEmpty := template.New("template test")
	// empty pipeline following if
	tEmpty = template.Must(tEmpty.Parse("Empty pipeline if demo: {{if ``}} Will not print.{{end}}\n"))
	tEmpty.Execute(os.Stdout, nil)

	tWithValue := template.New("template test")
	tWithValue = template.Must(tWithValue.Parse("Non empty pipeline if demo: {{if `anything`}} Will print.{{end}}\n"))
	tWithValue.Execute(os.Stdout, nil)

	tIfElse := template.New("tempalte test")
	tIfElse = template.Must(tIfElse.Parse("if-else demo: {{if ``}} Print IF part. {{else}} Print ELSE part.{{end}}\n"))
	tIfElse.Execute(os.Stdout, nil)
}

/* with-end */
func template_with_end() {
	fmt.Println("template with-end case ==============")
	t := template.New("test")
	t, _ = t.Parse("{{with `hello`}} {{.}} {{end}}!\n")
	t.Execute(os.Stdout, "wanghua")

	t, _ = t.Parse("{{with `hello`}}{{.}} {{with `Mary`}} {{.}}{{end}}{{end}}!\n")
	t.Execute(os.Stdout, "hello")
}
